package com.example.design.shejimoshi.action.template;

public abstract class Game {

    // 模板里的逻辑都能复用
    // 除了留给子类扩展的方法,abstract的是强制子类重写的,空实现的,是让子类决定是否重写
    public final void play(){
        initGame();
        startPlay();
        broadcastAdvertisement();
        endPlay();
    }

    // 共同的且繁琐的操作
    protected void initGame(){
        System.out.println("初始化游戏");
    }
    protected void startPlay(){
        System.out.println("游戏开始");
    }
    protected void endPlay(){
        System.out.println("游戏结束");
    }

    // 由子类定制的操作: 可以定义为abstract,强制子类实现;也可以定义为空方法,让子类决定是否重写
    // 钩子方法：定义为空实现, 让子类自己实现
    protected void broadcastAdvertisement(){}
}
